local dropdash = 0
local dropdashlength = 0
addHook("PlayerThink", do
    for player in players.iterate
        if player.mo.skin ~= "sonic2"
			return
		end
		if (player.cmd.buttons & BT_SPIN) and (player.pflags & PF_JUMPED) then
			dropdash = 1
			dropdashlength = 10*FRACUNIT
			
		end
		if player.mo.eflags & MFE_VERTICALFLIP then
			if player.mo.z >= player.mo.ceilingz and dropdash == 1  then
				dropdashlength = dropdashlength + FRACUNIT
				player.mo.state = S_PLAY_SPINDASH
				player.pflags = $1|PF_SPINNING
			end
			if player.mo.z <= player.mo.ceilingz and dropdash == 1 then
				dropdash = 0
				player.mo.state = S_PLAY_ROLL
				P_Thrust(player.mo, player.mo.angle, dropdashlength)
				player.pflags = $1|PF_SPINNING
				dropdashlength = 0
			end
			if (player.pflags & PF_SPINNING) then
				player.normalspeed = player.speed+FRACUNIT
			else
					player.normalspeed = 36*FRACUNIT
			end
		
		else
			if player.mo.z >= player.mo.floorz and dropdash == 1  then
				dropdashlength = dropdashlength + FRACUNIT
				player.mo.state = S_PLAY_SPINDASH
				player.pflags = $1|PF_SPINNING
			end
			if player.mo.z <= player.mo.floorz and dropdash == 1 then
				dropdash = 0
				player.mo.state = S_PLAY_ROLL
				P_Thrust(player.mo, player.mo.angle, dropdashlength)
				player.pflags = $1|PF_SPINNING
				dropdashlength = 0
			end
			if (player.pflags & PF_SPINNING) then
				player.normalspeed = player.speed+FRACUNIT
			else
					player.normalspeed = 36*FRACUNIT
			end
		end
    end
end)

addHook("AbilitySpecial", do
    for player in players.iterate
        if player.mo.skin ~= "sonic2"
			return
		end		
		if (player.cmd.buttons & BT_JUMP) and (player.pflags & PF_JUMPED) and not (player.pflags & PF_THOKKED) and not (player.pflags & PF_JUMPDOWN) then
			P_SetObjectMomZ(player.mo, -20*FRACUNIT, true)
			dropdash = 1
			dropdashlength = 10*FRACUNIT
			player.mo.state = S_PLAY_SPINDASH
		end
    end
end)